package com.kuolie.answer.controller;

import com.alibaba.fastjson.JSONObject;
import com.kuolie.answer.entity.User;
import com.kuolie.answer.service.UserService;
import com.kuolie.answer.utils.AesCbcUtil;
import com.kuolie.answer.utils.HttpRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * 用户信息API
 */
@Controller
@RequestMapping(value = "/user")
public class UserController {

    @Autowired
    private UserService userService;

    /**
     * 解密用户敏感数据并将新用户添加至数据库
     * @param encryptedData 明文,加密数据
     * @param iv            加密算法的初始向量
     * @param code          用户允许登录后，回调内容会带上 code（有效期五分钟），开发者需要将 code 发送到开发者服务器后台，使用code 换取 session_key api，将 code 换成 openid 和 session_key
     * @return              用户信息
     */
    @RequestMapping(value = "/setUserInfo", method = RequestMethod.POST)
    @ResponseBody
    public User insertUser(String encryptedData, String iv, String code){
        User user = null;
        String wxspAppid = "wxedfb801b90c7ed50";//小程序唯一标识   (在微信小程序管理后台获取)
        String wxspSecret = "338f0c78c1f6a9ba773dbbd6773210fd";//小程序的 app secret (在微信小程序管理后台获取)
        String grant_type = "authorization_code";//授权（必填）
        //1、向微信服务器 使用登录凭证 code 获取 session_key 和 openid
        String params = "appid=" + wxspAppid + "&secret=" + wxspSecret + "&js_code=" + code + "&grant_type=" + grant_type;//请求参数
        String str = HttpRequest.sendGet("https://api.weixin.qq.com/sns/jscode2session", params);//发送请求
        JSONObject json = JSONObject.parseObject(str);//解析相应内容（转换成json对象）
        String session_key = json.get("session_key").toString();//获取会话密钥（session_key）
        String openid = json.get("openid").toString();//用户的唯一标识（openid）
        //2、连接MongoDB数据库，查询该条信息是否存在
        user = userService.findByOpenid(openid);
        if (user!=null){//存在则直接返回该用户
            return user;
        }else{//不存在则解密并新增该用户
            user = new User();
            //3、对encryptedData加密数据进行AES解密
            try {
                String result = AesCbcUtil.decrypt(encryptedData, session_key, iv, "UTF-8");
                if (null != result && result.length() > 0) {
                    JSONObject userInfoJSON = JSONObject.parseObject(result);
                    user.setOpenid(userInfoJSON.get("openId").toString());
                    user.setNickname(userInfoJSON.get("nickName").toString());
                    user.setAvatarurl(userInfoJSON.get("avatarUrl").toString());
                    user.setCity(userInfoJSON.get("city").toString());
                    user.setCountry(userInfoJSON.get("country").toString());
                    user.setGender(userInfoJSON.get("gender").toString());
                    user.setProvince(userInfoJSON.get("province").toString());
                    user.setUnionid("null");
                    userService.insert(user);//新增用户
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return user;
    }

    @RequestMapping(value = "test")
    public String aaa(){
        return "test";
    }

    @RequestMapping("/index")
    public String index(){
        System.out.println("6666666666666666666");
        return "index";
    }

}
